package com.zhf.photowalldemo;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.widget.ImageView;

import com.jakewharton.disklrucache.DiskLruCache;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import static android.os.Environment.isExternalStorageRemovable;

public class DiskManageUtil {

//    final static String IMGURL = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg";


    /**
     * 创建DiskLruCache实例，初始化缓存数据
     * @param context
     * @return
     */
    public static DiskLruCache open(Context context , String uniqueName) {

        try {
            // 首先调用getDiskCacheDir()方法获取到缓存地址的路径，然后判断一下该路径是否存在，如果不存在就创建一下
            File cacheDir = getDiskCacheDir(context, uniqueName);
            if (!cacheDir.exists()) {
                cacheDir.mkdirs();
            }
            // 接着调用DiskLruCache的open()方法来创建实例，并把四个参数传入即可。
            return  DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024); // 10 M
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     *  判断外部存储是否存在
     * 获取图片缓存路径
     * @param context
     * @param uniqueName
     * @return
     */
    private static File getDiskCacheDir(Context context, String uniqueName) {
        final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable()
                ? context.getExternalCacheDir().getPath()
                : context.getCacheDir().getPath();
        return new File(cachePath + File.separator + uniqueName);
    }

    /**
     *  获取到当前应用程序的版本号
     *   每当版本号改变
     *   缓存路径下存储的所有数据都会被清除掉
     *   因为DiskLruCache认为当应用程序有版本更新的时候，所有的数据都应该从网上重新获取。
     * @param context
     * @return
     */
    private static int getAppVersion(Context context) {
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return info.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return 1;
    }




//  static   DiskLruCache mDiskLruCache = null;
//
//    public static void opween(Context context) {
//
//        try {
//            // 首先调用getDiskCacheDir()方法获取到缓存地址的路径，然后判断一下该路径是否存在，如果不存在就创建一下
//            File cacheDir = getDiskCacheDir(context, "bitmap");
//            if (!cacheDir.exists()) {
//                cacheDir.mkdirs();
//            }
//            // 接着调用DiskLruCache的open()方法来创建实例，并把四个参数传入即可。
//            mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//
//
//        // 一次完整写入操作
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    String key = hashKeyForDisk(IMGURL);
//                    DiskLruCache.Editor editor = mDiskLruCache.edit(key);
//                    if (editor != null) {
//                        OutputStream outputStream = editor.newOutputStream(0);
//                        if (downloadUrlToStream(IMGURL, outputStream)) {
//                            editor.commit();
//                        } else {
//                            editor.abort();
//                        }
//                    }
//                    mDiskLruCache.flush();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }).start();
//    }
//
//
//    // 写入缓存
//    private static  boolean downloadUrlToStream(String urlString, OutputStream outputStream) {
//        HttpURLConnection urlConnection = null;
//        BufferedOutputStream out = null;
//        BufferedInputStream in = null;
//        try {
//            final URL url = new URL(urlString);
//            urlConnection = (HttpURLConnection) url.openConnection();
//            in = new BufferedInputStream(urlConnection.getInputStream(), 8 * 1024);
//            out = new BufferedOutputStream(outputStream, 8 * 1024);
//            int b;
//            while ((b = in.read()) != -1) {
//                out.write(b);
//            }
//            return true;
//        } catch (final IOException e) {
//            e.printStackTrace();
//        } finally {
//            if (urlConnection != null) {
//                urlConnection.disconnect();
//            }
//            try {
//                if (out != null) {
//                    out.close();
//                }
//                if (in != null) {
//                    in.close();
//                }
//            } catch (final IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return false;
//    }
//
//
//    // 用来将字符串进行MD5编码
//    public static String hashKeyForDisk(String key) {
//        String cacheKey;
//        try {
//            final MessageDigest mDigest = MessageDigest.getInstance("MD5");
//            mDigest.update(key.getBytes());
//            cacheKey = bytesToHexString(mDigest.digest());
//        } catch (NoSuchAlgorithmException e) {
//            cacheKey = String.valueOf(key.hashCode());
//        }
//        return cacheKey;
//    }
//
//    private static String bytesToHexString(byte[] bytes) {
//        StringBuilder sb = new StringBuilder();
//        for (int i = 0; i < bytes.length; i++) {
//            String hex = Integer.toHexString(0xFF & bytes[i]);
//            if (hex.length() == 1) {
//                sb.append('0');
//            }
//            sb.append(hex);
//        }
//        return sb.toString();
//    }
//
//
//    public static void getImage(ImageView imageView , String  imageURL) {
//        try {
//            String key = hashKeyForDisk(IMGURL);
//            DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key);
//            if (snapShot != null) {
//                InputStream is = snapShot.getInputStream(0);
//                Bitmap bitmap = BitmapFactory.decodeStream(is);
//                imageView.setImageBitmap(bitmap);
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }


}
